﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using Excel = Microsoft.Office.Interop.Excel;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using System.Windows.Forms;
using System.IO;
using System.Collections;

namespace GeneralLibs.ClassLibs
{
    public class ExportToExcel
    {
        public enum ExportType
        {
            Word = 1, Pdf = 2, Excel = 3
        }

        static public DataTable ConvertHastTableToDataTable(System.Collections.Hashtable hashtable)
        {

            var dataTable = new DataTable(hashtable.GetType().Name);
            dataTable.Columns.Add("Key", typeof(object));
            dataTable.Columns.Add("Value", typeof(object));
            IDictionaryEnumerator enumerator = hashtable.GetEnumerator();
            while (enumerator.MoveNext())
            {
                dataTable.Rows.Add(enumerator.Key, enumerator.Value);
            }
            return dataTable;
        }

        static public bool ExportDataToExcel(System.Collections.Hashtable hashtable)
        {
            //Convert Hashtable --> DataTable
            DataTable dt = new DataTable();
            try
            {
                dt = ConvertHastTableToDataTable(hashtable);
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }

            //Xuất ra excel
            try
            {
                return ExportDataToExcel(dt);
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        static public bool ExportDataToExcel(string tieude, DataTable dt)
        {
            try
            {
                bool result = false;
                //khoi tao cac doi tuong Com Excel de lam viec
                Excel.ApplicationClass xlApp;
                Excel.Worksheet xlSheet;
                Excel.Workbook xlBook;
                //doi tuong Trống để thêm  vào xlApp sau đó lưu lại sau
                object missValue = System.Reflection.Missing.Value;
                //khoi tao doi tuong Com Excel moi
                xlApp = new Excel.ApplicationClass();
                xlBook = xlApp.Workbooks.Add(missValue);
                //su dung Sheet dau tien de thao tac
                xlSheet = (Excel.Worksheet)xlBook.Worksheets.get_Item(1);
                //không cho hiện ứng dụng Excel lên để tránh gây đơ máy
                xlApp.Visible = false;
                int socot = dt.Columns.Count;
                int sohang = dt.Rows.Count;
                int i, j;

                SaveFileDialog f = new SaveFileDialog();
                f.Filter = "Excel file (*.xls)|*.xls";
                if (f.ShowDialog() == DialogResult.OK)
                {
                    //set thuoc tinh cho tieu de
                    xlSheet.get_Range("A1", Convert.ToChar(socot + 65) + "1").Merge(false);
                    Excel.Range caption = xlSheet.get_Range("A1", Convert.ToChar(socot + 65) + "1");
                    caption.Select();
                    caption.FormulaR1C1 = tieude;
                    //căn lề cho tiêu đề
                    caption.HorizontalAlignment = Excel.Constants.xlCenter;
                    caption.Font.Bold = true;
                    caption.VerticalAlignment = Excel.Constants.xlCenter;
                    caption.Font.Size = 15;
                    //màu nền cho tiêu đề
                    caption.Interior.ColorIndex = 20;
                    caption.RowHeight = 30;
                    //set thuoc tinh cho cac header
                    Excel.Range header = xlSheet.get_Range("A2", Convert.ToChar(socot + 65) + "2");
                    header.Select();

                    header.HorizontalAlignment = Excel.Constants.xlCenter;
                    header.Font.Bold = true;
                    header.Font.Size = 10;
                    //điền tiêu đề cho các cột trong file excel
                    for (i = 0; i < socot; i++)
                        xlSheet.Cells[2, i + 2] = dt.Columns[i].ColumnName;
                    //dien cot stt
                    xlSheet.Cells[2, 1] = "STT";
                    for (i = 0; i < sohang; i++)
                        xlSheet.Cells[i + 3, 1] = i + 1;

                    //Format cot Ma
                    xlSheet.get_Range(xlSheet.Cells[1, 2], xlSheet.Cells[65535, 2]).EntireColumn.NumberFormat = "@"; // @: kieu text

                    //dien du lieu vao sheet

                    for (i = 0; i < sohang; i++)
                        for (j = 0; j < socot; j++)
                        {
                            xlSheet.Cells[i + 3, j + 2] = dt.Rows[i][j].ToString();
                        }
                    //autofit độ rộng cho các cột 
                    for (i = 0; i < sohang; i++)
                        ((Excel.Range)xlSheet.Cells[1, i + 1]).EntireColumn.AutoFit();

                    //save file
                    xlBook.SaveAs(f.FileName, Excel.XlFileFormat.xlWorkbookNormal, missValue, missValue, missValue, missValue, Excel.XlSaveAsAccessMode.xlExclusive, missValue, missValue, missValue, missValue, missValue);
                    xlBook.Close(true, missValue, missValue);
                    xlApp.Quit();

                    // release cac doi tuong COM
                    ReleaseObject(xlSheet);
                    ReleaseObject(xlBook);
                    ReleaseObject(xlApp);
                    result = true;
                }
                if (result) MessageBox.Show("Xuất ra file excel thành công!", "Thông báo");
                else MessageBox.Show("Xuất ra file excel thất bại!", "Thông báo");

                return result;
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        static public bool ExportDataToExcel(string tieude, DataTable dt, string fileName)
        {
            try
            {
                bool result = false;
                //khoi tao cac doi tuong Com Excel de lam viec
                Excel.ApplicationClass xlApp;
                Excel.Worksheet xlSheet;
                Excel.Workbook xlBook;
                //doi tuong Trống để thêm  vào xlApp sau đó lưu lại sau
                object missValue = System.Reflection.Missing.Value;
                //khoi tao doi tuong Com Excel moi
                xlApp = new Excel.ApplicationClass();
                xlBook = xlApp.Workbooks.Add(missValue);
                //su dung Sheet dau tien de thao tac
                xlSheet = (Excel.Worksheet)xlBook.Worksheets.get_Item(1);
                //không cho hiện ứng dụng Excel lên để tránh gây đơ máy
                xlApp.Visible = false;
                int socot = dt.Columns.Count;
                int sohang = dt.Rows.Count;
                int i, j;

                SaveFileDialog f = new SaveFileDialog();
                f.Filter = "Excel file (*.xls)|*.xls";
                f.FileName = fileName;
                if (f.ShowDialog() == DialogResult.OK)
                {
                    //set thuoc tinh cho tieu de
                    xlSheet.get_Range("A1", Convert.ToChar(socot + 65) + "1").Merge(false);
                    Excel.Range caption = xlSheet.get_Range("A1", Convert.ToChar(socot + 65) + "1");
                    caption.Select();
                    caption.FormulaR1C1 = tieude;
                    //căn lề cho tiêu đề
                    caption.HorizontalAlignment = Excel.Constants.xlCenter;
                    caption.Font.Bold = true;
                    caption.VerticalAlignment = Excel.Constants.xlCenter;
                    caption.Font.Size = 15;
                    //màu nền cho tiêu đề
                    caption.Interior.ColorIndex = 20;
                    caption.RowHeight = 30;
                    //set thuoc tinh cho cac header
                    Excel.Range header = xlSheet.get_Range("A2", Convert.ToChar(socot + 65) + "2");
                    header.Select();

                    header.HorizontalAlignment = Excel.Constants.xlCenter;
                    header.Font.Bold = true;
                    header.Font.Size = 10;
                    //điền tiêu đề cho các cột trong file excel
                    for (i = 0; i < socot; i++)
                        xlSheet.Cells[2, i + 2] = dt.Columns[i].ColumnName;
                    //dien cot stt
                    xlSheet.Cells[2, 1] = "STT";
                    for (i = 0; i < sohang; i++)
                        xlSheet.Cells[i + 3, 1] = i + 1;

                    //Format cot Ma
                    xlSheet.get_Range(xlSheet.Cells[1, 2], xlSheet.Cells[65535, 2]).EntireColumn.NumberFormat = "@"; // @: kieu text

                    //dien du lieu vao sheet

                    for (i = 0; i < sohang; i++)
                        for (j = 0; j < socot; j++)
                        {
                            xlSheet.Cells[i + 3, j + 2] = dt.Rows[i][j].ToString();
                        }
                    //autofit độ rộng cho các cột 
                    for (i = 0; i < sohang; i++)
                        ((Excel.Range)xlSheet.Cells[1, i + 1]).EntireColumn.AutoFit();

                    //save file
                    xlBook.SaveAs(f.FileName, Excel.XlFileFormat.xlWorkbookNormal, missValue, missValue, missValue, missValue, Excel.XlSaveAsAccessMode.xlExclusive, missValue, missValue, missValue, missValue, missValue);
                    xlBook.Close(true, missValue, missValue);
                    xlApp.Quit();

                    // release cac doi tuong COM
                    ReleaseObject(xlSheet);
                    ReleaseObject(xlBook);
                    ReleaseObject(xlApp);
                    result = true;
                }
                if (result) MessageBox.Show("Xuất ra file excel thành công!", "Thông báo");
                else MessageBox.Show("Xuất ra file excel thất bại!", "Thông báo");

                return result;
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }
        static public bool ExportDataToExcel(string tieude, DataTable dt, string fileName, string directoryPath, out string directoryPathSaved)
        {
            directoryPathSaved = "";

            try
            {
                bool result = false;
                //khoi tao cac doi tuong Com Excel de lam viec
                Excel.ApplicationClass xlApp;
                Excel.Worksheet xlSheet;
                Excel.Workbook xlBook;
                //doi tuong Trống để thêm  vào xlApp sau đó lưu lại sau
                object missValue = System.Reflection.Missing.Value;
                //khoi tao doi tuong Com Excel moi
                xlApp = new Excel.ApplicationClass();
                xlBook = xlApp.Workbooks.Add(missValue);
                //su dung Sheet dau tien de thao tac
                xlSheet = (Excel.Worksheet)xlBook.Worksheets.get_Item(1);
                //không cho hiện ứng dụng Excel lên để tránh gây đơ máy
                xlApp.Visible = false;
                int socot = dt.Columns.Count;
                int sohang = dt.Rows.Count;
                int i, j;

                SaveFileDialog f = new SaveFileDialog();
                f.Filter = "Excel file (*.xls)|*.xls";
                f.FileName = fileName;
                if (directoryPath != null && directoryPath != "")
                {
                    f.InitialDirectory = Path.GetFullPath(directoryPath);
                    f.RestoreDirectory = true;
                }

                if (f.ShowDialog() == DialogResult.OK)
                {
                    directoryPathSaved = Path.GetDirectoryName(f.FileName); //out ra ngoài để lưu đường dẫn lần sau nhớ tự động

                    //set thuoc tinh cho tieu de
                    xlSheet.get_Range("A1", Convert.ToChar(socot + 65) + "1").Merge(false);
                    Excel.Range caption = xlSheet.get_Range("A1", Convert.ToChar(socot + 65) + "1");
                    caption.Select();
                    caption.FormulaR1C1 = tieude;
                    //căn lề cho tiêu đề
                    caption.HorizontalAlignment = Excel.Constants.xlCenter;
                    caption.Font.Bold = true;
                    caption.VerticalAlignment = Excel.Constants.xlCenter;
                    caption.Font.Size = 15;
                    //màu nền cho tiêu đề
                    caption.Interior.ColorIndex = 20;
                    caption.RowHeight = 30;
                    //set thuoc tinh cho cac header
                    Excel.Range header = xlSheet.get_Range("A2", Convert.ToChar(socot + 65) + "2");
                    header.Select();

                    header.HorizontalAlignment = Excel.Constants.xlCenter;
                    header.Font.Bold = true;
                    header.Font.Size = 10;
                    //điền tiêu đề cho các cột trong file excel
                    for (i = 0; i < socot; i++)
                        xlSheet.Cells[2, i + 2] = dt.Columns[i].ColumnName;
                    //dien cot stt
                    xlSheet.Cells[2, 1] = "STT";
                    for (i = 0; i < sohang; i++)
                        xlSheet.Cells[i + 3, 1] = i + 1;

                    //Format cot Ma
                    xlSheet.get_Range(xlSheet.Cells[1, 2], xlSheet.Cells[65535, 2]).EntireColumn.NumberFormat = "@"; // @: kieu text

                    //dien du lieu vao sheet

                    for (i = 0; i < sohang; i++)
                        for (j = 0; j < socot; j++)
                        {
                            xlSheet.Cells[i + 3, j + 2] = dt.Rows[i][j].ToString();
                        }
                    //autofit độ rộng cho các cột 
                    for (i = 0; i < sohang; i++)
                        ((Excel.Range)xlSheet.Cells[1, i + 1]).EntireColumn.AutoFit();

                    //save file
                    xlBook.SaveAs(f.FileName, Excel.XlFileFormat.xlWorkbookNormal, missValue, missValue, missValue, missValue, Excel.XlSaveAsAccessMode.xlExclusive, missValue, missValue, missValue, missValue, missValue);
                    xlBook.Close(true, missValue, missValue);
                    xlApp.Quit();

                    // release cac doi tuong COM
                    ReleaseObject(xlSheet);
                    ReleaseObject(xlBook);
                    ReleaseObject(xlApp);
                    result = true;
                }
                if (result) MessageBox.Show("Xuất ra file excel thành công!", "Thông báo");
                else MessageBox.Show("Xuất ra file excel thất bại!", "Thông báo");

                return result;
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        static public bool ExportDataToExcel(DataTable dt)
        {
            try
            {
                bool result = false;
                //khoi tao cac doi tuong Com Excel de lam viec
                Excel.ApplicationClass xlApp;
                Excel.Worksheet xlSheet;
                Excel.Workbook xlBook;
                //doi tuong Trống để thêm  vào xlApp sau đó lưu lại sau
                object missValue = System.Reflection.Missing.Value;
                //khoi tao doi tuong Com Excel moi
                xlApp = new Excel.ApplicationClass();
                xlBook = xlApp.Workbooks.Add(missValue);
                //su dung Sheet dau tien de thao tac
                xlSheet = (Excel.Worksheet)xlBook.Worksheets.get_Item(1);
                //không cho hiện ứng dụng Excel lên để tránh gây đơ máy
                xlApp.Visible = false;
                int socot = dt.Columns.Count;
                int sohang = dt.Rows.Count;
                int i, j;

                SaveFileDialog f = new SaveFileDialog();
                f.Filter = "Excel file (*.xls)|*.xls";
                if (f.ShowDialog() == DialogResult.OK)
                {
                    Excel.Range header = xlSheet.get_Range("A1", Convert.ToChar(socot + 65) + "1");
                    header.Select();

                    header.HorizontalAlignment = Excel.Constants.xlCenter;
                    header.Font.Bold = true;
                    header.Font.Size = 10;
                    //điền tiêu đề cho các cột trong file excel
                    for (i = 0; i < socot; i++)
                        xlSheet.Cells[1, i + 2] = dt.Columns[i].ColumnName;
                    //dien cot stt
                    xlSheet.Cells[1, 1] = "STT";

                    for (i = 0; i < sohang; i++)
                        xlSheet.Cells[i + 2, 1] = i + 1;

                    //Format cot Ma
                    xlSheet.get_Range(xlSheet.Cells[1, 2], xlSheet.Cells[65535, 2]).EntireColumn.NumberFormat = "@"; // @: kieu text

                    //dien du lieu vao sheet
                    for (i = 0; i < sohang; i++)
                        for (j = 0; j < socot; j++)
                        {
                            try
                            {
                                xlSheet.Cells[i + 2, j + 2] = dt.Rows[i][j].ToString();
                            }
                            catch (Exception ex)
                            {
                            }
                        }

                    //autofit độ rộng cho các cột, nếu nhiều dòng quá sẽ lỗi nên phải hạn chế dưới 1000 dòng mới tự fit
                    if (sohang < 1000)
                    {
                        for (i = 0; i < sohang; i++)
                            ((Excel.Range)xlSheet.Cells[1, i + 1]).EntireColumn.AutoFit();
                    }

                    //save file
                    xlBook.SaveAs(f.FileName, Excel.XlFileFormat.xlWorkbookNormal, missValue, missValue, missValue, missValue, Excel.XlSaveAsAccessMode.xlExclusive, missValue, missValue, missValue, missValue, missValue);
                    xlBook.Close(true, missValue, missValue);
                    xlApp.Quit();

                    // release cac doi tuong COM
                    ReleaseObject(xlSheet);
                    ReleaseObject(xlBook);
                    ReleaseObject(xlApp);
                    result = true;

                }
                if (result) MessageBox.Show("Xuất ra file excel thành công!", "Thông báo");
                else MessageBox.Show("Xuất ra file excel thất bại!", "Thông báo");

                return result;
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        static public bool ExportDataToExcel(DataTable dt, string fileName)
        {
            try
            {
                bool result = false;
                //khoi tao cac doi tuong Com Excel de lam viec
                Excel.ApplicationClass xlApp;
                Excel.Worksheet xlSheet;
                Excel.Workbook xlBook;
                //doi tuong Trống để thêm  vào xlApp sau đó lưu lại sau
                object missValue = System.Reflection.Missing.Value;
                //khoi tao doi tuong Com Excel moi
                xlApp = new Excel.ApplicationClass();
                xlBook = xlApp.Workbooks.Add(missValue);
                //su dung Sheet dau tien de thao tac
                xlSheet = (Excel.Worksheet)xlBook.Worksheets.get_Item(1);
                //không cho hiện ứng dụng Excel lên để tránh gây đơ máy
                xlApp.Visible = false;
                int socot = dt.Columns.Count;
                int sohang = dt.Rows.Count;
                int i, j;

                SaveFileDialog f = new SaveFileDialog();
                f.Filter = "Excel file (*.xls)|*.xls";
                f.FileName = fileName;
                if (f.ShowDialog() == DialogResult.OK)
                {
                    Excel.Range header = xlSheet.get_Range("A1", Convert.ToChar(socot + 65) + "1");
                    header.Select();

                    header.HorizontalAlignment = Excel.Constants.xlCenter;
                    header.Font.Bold = true;
                    header.Font.Size = 10;
                    //điền tiêu đề cho các cột trong file excel
                    for (i = 0; i < socot; i++)
                        xlSheet.Cells[1, i + 2] = dt.Columns[i].ColumnName;
                    //dien cot stt
                    xlSheet.Cells[1, 1] = "STT";

                    for (i = 0; i < sohang; i++)
                        xlSheet.Cells[i + 2, 1] = i + 1;

                    //Format cot Ma
                    xlSheet.get_Range(xlSheet.Cells[1, 2], xlSheet.Cells[65535, 2]).EntireColumn.NumberFormat = "@"; // @: kieu text

                    //dien du lieu vao sheet
                    for (i = 0; i < sohang; i++)
                        for (j = 0; j < socot; j++)
                        {
                            xlSheet.Cells[i + 2, j + 2] = dt.Rows[i][j].ToString();
                        }

                    //autofit độ rộng cho các cột, nếu nhiều dòng quá sẽ lỗi nên phải hạn chế dưới 1000 dòng mới tự fit
                    if (sohang < 1000)
                    {
                        for (i = 0; i < sohang; i++)
                            ((Excel.Range)xlSheet.Cells[1, i + 1]).EntireColumn.AutoFit();
                    }

                    //save file
                    xlBook.SaveAs(f.FileName, Excel.XlFileFormat.xlWorkbookNormal, missValue, missValue, missValue, missValue, Excel.XlSaveAsAccessMode.xlExclusive, missValue, missValue, missValue, missValue, missValue);
                    xlBook.Close(true, missValue, missValue);
                    xlApp.Quit();

                    // release cac doi tuong COM
                    ReleaseObject(xlSheet);
                    ReleaseObject(xlBook);
                    ReleaseObject(xlApp);
                    result = true;

                }
                if (result) MessageBox.Show("Xuất ra file excel thành công!", "Thông báo");
                else MessageBox.Show("Xuất ra file excel thất bại!", "Thông báo");

                return result;
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        static public bool ExportDataToExcel(int soLuongSheet, DataSet ds)
        {
            try
            {
                if (soLuongSheet != ds.Tables.Count)
                {
                    MessageBox.Show("Số Bảng biểu và số Sheet Excel chưa bằng nhau.\nKhông thể thực hiện tác vụ này");
                }
                DataTable dt = new DataTable();
                bool result = false;
                //khoi tao cac doi tuong Com Excel de lam viec
                object missValue = System.Reflection.Missing.Value;
                Excel.ApplicationClass xlApp = new Excel.ApplicationClass();
                Excel.Workbook xlBook = xlApp.Workbooks.Add(missValue);
                Excel.Worksheet xlSheet;

                #region export vào từng sheet
                SaveFileDialog f = new SaveFileDialog();
                f.Filter = "Excel file (*.xls)|*.xls";
                //f.FileName = fileName;
                if (f.ShowDialog() == DialogResult.OK)
                {
                    for (int sheetIndex = 1; sheetIndex <= soLuongSheet; sheetIndex++)
                    {
                        xlSheet = (Excel.Worksheet)xlBook.Worksheets.get_Item(sheetIndex);
                        xlApp.Visible = false;

                        dt.Clear();
                        dt = ds.Tables[sheetIndex - 1];
                        xlSheet.Name = dt.TableName.ToString();

                        int socot = dt.Columns.Count;
                        int sohang = dt.Rows.Count;
                        int i, j;

                        Excel.Range header = xlSheet.get_Range("A1", "Z1");

                        header.HorizontalAlignment = Excel.Constants.xlCenter;
                        header.Font.Bold = true;
                        header.Font.Size = 10;
                        //điền tiêu đề cho các cột trong file excel
                        for (i = 0; i < socot; i++)
                            xlSheet.Cells[1, i + 2] = dt.Columns[i].ColumnName;
                        //dien cot stt
                        xlSheet.Cells[1, 1] = "STT";

                        for (i = 0; i < sohang; i++)
                            xlSheet.Cells[i + 2, 1] = i + 1;

                        //Format cot Ma
                        xlSheet.get_Range(xlSheet.Cells[1, 2], xlSheet.Cells[65535, 2]).EntireColumn.NumberFormat = "@"; // @: kieu text

                        //dien du lieu vao sheet
                        for (i = 0; i < sohang; i++)
                            for (j = 0; j < socot; j++)
                            {
                                xlSheet.Cells[i + 2, j + 2] = dt.Rows[i][j].ToString();
                            }

                        //autofit độ rộng cho các cột, nếu nhiều dòng quá sẽ lỗi nên phải hạn chế dưới 1000 dòng mới tự fit
                        if (sohang < 1000)
                        {
                            for (i = 0; i < sohang; i++)
                                ((Excel.Range)xlSheet.Cells[1, i + 1]).EntireColumn.AutoFit();
                        }

                        xlBook.Save();
                        result = true;

                        //save file
                        if (sheetIndex == soLuongSheet)
                        {
                            xlBook.SaveAs(f.FileName, Excel.XlFileFormat.xlWorkbookNormal, missValue, missValue, missValue, missValue, Excel.XlSaveAsAccessMode.xlExclusive, missValue, missValue, missValue, missValue, missValue);
                            xlBook.Close(true, missValue, missValue);
                            xlApp.Quit();

                            // release cac doi tuong COM
                            ReleaseObject(xlSheet);
                            ReleaseObject(xlBook);
                            ReleaseObject(xlApp);
                        }
                    }

                }
                #endregion

                if (result) MessageBox.Show("Xuất ra file excel thành công!", "Thông báo");
                else MessageBox.Show("Xuất ra file excel thất bại!", "Thông báo");

                return result;
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        static public bool ExportDataToExcel(DataSet ds, string fileName)
        {
            try
            {
                //Xóa bảng không có dữ liệu đi
                int k = 0;
                while (k < ds.Tables.Count)
                {
                    DataTable dtCheck = ds.Tables[k];
                    if (dtCheck.Rows.Count <= 0 && ds.Tables.CanRemove(dtCheck)) ds.Tables.Remove(dtCheck);
                    k++;
                }

                DataTable dt = new DataTable();
                bool result = false;
                //khoi tao cac doi tuong Com Excel de lam viec
                object missValue = System.Reflection.Missing.Value;
                Excel.ApplicationClass xlApp = new Excel.ApplicationClass();
                Excel.Workbook xlBook = xlApp.Workbooks.Add(missValue);
                Excel.Worksheet xlSheet;

                #region export vào từng sheet
                SaveFileDialog f = new SaveFileDialog();
                f.Filter = "Excel file (*.xls)|*.xls";
                f.FileName = fileName;

                if (f.ShowDialog() == DialogResult.OK)
                {
                    foreach (DataTable dataTable in ds.Tables)
                    {
                        for (int sheetIndex = 1; sheetIndex <= ds.Tables.Count; sheetIndex++)
                        {
                            xlSheet = (Excel.Worksheet)xlBook.Worksheets.get_Item(sheetIndex);
                            xlApp.Visible = false;

                            dt.Clear();
                            dt = ds.Tables[sheetIndex - 1];
                            xlSheet.Name = dt.TableName.ToString();

                            int socot = dt.Columns.Count;
                            int sohang = dt.Rows.Count;
                            int i, j;

                            Excel.Range header = xlSheet.get_Range("A1", "Z1");

                            header.HorizontalAlignment = Excel.Constants.xlCenter;
                            header.Font.Bold = true;
                            header.Font.Size = 10;
                            //điền tiêu đề cho các cột trong file excel
                            for (i = 0; i < socot; i++)
                                xlSheet.Cells[1, i + 2] = dt.Columns[i].ColumnName;
                            //dien cot stt
                            xlSheet.Cells[1, 1] = "STT";

                            for (i = 0; i < sohang; i++)
                                xlSheet.Cells[i + 2, 1] = i + 1;

                            //Format cot Ma
                            xlSheet.get_Range(xlSheet.Cells[1, 2], xlSheet.Cells[65535, 2]).EntireColumn.NumberFormat = "@"; // @: kieu text

                            //dien du lieu vao sheet
                            for (i = 0; i < sohang; i++)
                                for (j = 0; j < socot; j++)
                                {
                                    xlSheet.Cells[i + 2, j + 2] = dt.Rows[i][j].ToString();
                                }

                            //autofit độ rộng cho các cột, nếu nhiều dòng quá sẽ lỗi nên phải hạn chế dưới 1000 dòng mới tự fit
                            if (sohang < 1000)
                            {
                                for (i = 0; i < sohang; i++)
                                    ((Excel.Range)xlSheet.Cells[1, i + 1]).EntireColumn.AutoFit();
                            }

                            xlBook.Save();
                            result = true;

                            //save file
                            if (sheetIndex == ds.Tables.Count)
                            {
                                xlBook.SaveAs(f.FileName, Excel.XlFileFormat.xlWorkbookNormal, missValue, missValue, missValue, missValue, Excel.XlSaveAsAccessMode.xlExclusive, missValue, missValue, missValue, missValue, missValue);
                                xlBook.Close(true, missValue, missValue);
                                xlApp.Quit();

                                // release cac doi tuong COM
                                ReleaseObject(xlSheet);
                                ReleaseObject(xlBook);
                                ReleaseObject(xlApp);
                            }
                        }
                    }
                }
                #endregion

                if (result) MessageBox.Show("Xuất ra file excel thành công!", "Thông báo");
                else MessageBox.Show("Xuất ra file excel thất bại!", "Thông báo");

                return result;
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex.Message.Contains("COM object that has been separated from its underlying RCW cannot be used"))
                {
                    MessageBox.Show("Xuất ra file excel thành công!", "Thông báo");
                    return true;
                }
                else if (ex is CustomException) throw ex;
                else throw new Exception(ex.Message);
            }
        }
        static public bool ExportDataToExcel(DataSet ds, string fileName, string directoryPath, out string directoryPathSaved)
        {
            directoryPathSaved = "";
            try
            {
                //Xóa bảng không có dữ liệu đi
                int k = 0;
                while (k < ds.Tables.Count)
                {
                    DataTable dtCheck = ds.Tables[k];
                    if (dtCheck.Rows.Count <= 0 && ds.Tables.CanRemove(dtCheck)) ds.Tables.Remove(dtCheck);
                    k++;
                }

                DataTable dt = new DataTable();
                bool result = false;
                //khoi tao cac doi tuong Com Excel de lam viec
                object missValue = System.Reflection.Missing.Value;
                Excel.ApplicationClass xlApp = new Excel.ApplicationClass();
                Excel.Workbook xlBook = xlApp.Workbooks.Add(missValue);
                Excel.Worksheet xlSheet;

                #region export vào từng sheet
                SaveFileDialog f = new SaveFileDialog();
                f.Filter = "Excel file (*.xls)|*.xls";
                f.FileName = fileName;
                if (directoryPath != null && directoryPath != "")
                {
                    f.InitialDirectory = Path.GetFullPath(directoryPath);
                    f.RestoreDirectory = true;
                }

                if (f.ShowDialog() == DialogResult.OK)
                {
                    directoryPathSaved = Path.GetDirectoryName(f.FileName); //out ra ngoài để lưu đường dẫn lần sau nhớ tự động

                    foreach (DataTable dataTable in ds.Tables)
                    {
                        for (int sheetIndex = 1; sheetIndex <= ds.Tables.Count; sheetIndex++)
                        {
                            xlSheet = (Excel.Worksheet)xlBook.Worksheets.get_Item(sheetIndex);
                            xlApp.Visible = false;

                            dt.Clear();
                            dt = ds.Tables[sheetIndex - 1];
                            xlSheet.Name = dt.TableName.ToString();

                            int socot = dt.Columns.Count;
                            int sohang = dt.Rows.Count;
                            int i, j;

                            Excel.Range header = xlSheet.get_Range("A1", "Z1");

                            header.HorizontalAlignment = Excel.Constants.xlCenter;
                            header.Font.Bold = true;
                            header.Font.Size = 10;
                            //điền tiêu đề cho các cột trong file excel
                            for (i = 0; i < socot; i++)
                                xlSheet.Cells[1, i + 2] = dt.Columns[i].ColumnName;
                            //dien cot stt
                            xlSheet.Cells[1, 1] = "STT";

                            for (i = 0; i < sohang; i++)
                                xlSheet.Cells[i + 2, 1] = i + 1;

                            //Format cot Ma
                            xlSheet.get_Range(xlSheet.Cells[1, 2], xlSheet.Cells[65535, 2]).EntireColumn.NumberFormat = "@"; // @: kieu text

                            //dien du lieu vao sheet
                            for (i = 0; i < sohang; i++)
                                for (j = 0; j < socot; j++)
                                {
                                    xlSheet.Cells[i + 2, j + 2] = dt.Rows[i][j].ToString();
                                }

                            //autofit độ rộng cho các cột, nếu nhiều dòng quá sẽ lỗi nên phải hạn chế dưới 1000 dòng mới tự fit
                            if (sohang < 1000)
                            {
                                for (i = 0; i < sohang; i++)
                                    ((Excel.Range)xlSheet.Cells[1, i + 1]).EntireColumn.AutoFit();
                            }

                            xlBook.Save();
                            result = true;

                            //save file
                            if (sheetIndex == ds.Tables.Count)
                            {
                                xlBook.SaveAs(f.FileName, Excel.XlFileFormat.xlWorkbookNormal, missValue, missValue, missValue, missValue, Excel.XlSaveAsAccessMode.xlExclusive, missValue, missValue, missValue, missValue, missValue);
                                xlBook.Close(true, missValue, missValue);
                                xlApp.Quit();

                                // release cac doi tuong COM
                                ReleaseObject(xlSheet);
                                ReleaseObject(xlBook);
                                ReleaseObject(xlApp);
                            }
                        }
                    }
                }
                #endregion

                if (result) MessageBox.Show("Xuất ra file excel thành công!", "Thông báo");
                else MessageBox.Show("Xuất ra file excel thất bại!", "Thông báo");

                return result;
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex.Message.Contains("COM object that has been separated from its underlying RCW cannot be used"))
                {
                    MessageBox.Show("Xuất ra file excel thành công!", "Thông báo");
                    return true;
                }
                else if (ex is CustomException) throw ex;
                else throw new Exception(ex.Message);
            }
        }

        static  public void ReleaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
               throw new  Exception("Exception Occured while releasing object " + ex.ToString());
            }
            finally
            {
                GC.Collect();
            }
        }
   
        static public bool ExportReport(ExportType type,ReportDocument repd)
        {
            try
            {
                SaveFileDialog f = new SaveFileDialog();
                bool result = false;

                switch (type)
                {
                    case ExportType.Word:

                        f.Filter = "Word file(*.doc)|*.doc";
                        if (f.ShowDialog() == DialogResult.OK)
                        {
                            repd.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.WordForWindows, f.FileName);
                            result = true;
                        }
                        break;
                    case ExportType.Pdf:

                        f.Filter = "Pdf file(*.pdf)|*.pdf";
                        if (f.ShowDialog() == DialogResult.OK)
                        {
                            repd.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, f.FileName);
                            result = true;
                        }
                        break;
                    case ExportType.Excel:

                        f.Filter = "Excel file(*.xls)|*.xls";
                        if (f.ShowDialog() == DialogResult.OK)
                        {
                            repd.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.Excel, f.FileName);
                            result = true;
                        }
                        break;
                    default:
                        MessageBox.Show("Khong chon dung loai ");
                        break;


                }
                return result;
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        //SortData in DataTable
        static public DataTable AlphabeticSortDataTable(DataTable dtTable, string sortColumn, int sortOrder)
        {
            try
            {
                DataSet dsSorted = new DataSet();
                string columnKey = sortColumn;
                string sortDirection = "";
                string sortFormat = "{0} {1}";
                switch (sortOrder)
                {
                    case 0:
                        sortDirection = "ASC";
                        break;
                    case 1:
                        sortDirection = "DESC";
                        break;
                    default:
                        sortDirection = "ASC";
                        break;
                }

                dtTable.DefaultView.Sort = string.Format(sortFormat, columnKey, sortDirection);
                return dtTable.DefaultView.Table;
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        //Menthod chuẩn bị data cho xuất excel.Cần format cột khác nhau thì thêm ở đây
        static public void PreparingTableForExportExcel(ref DataSet ds)
        {
            DataTable dtMauNhapHoaDon = new DataTable();
            dtMauNhapHoaDon.TableName = "MauNhapHoaDon";
            DataTable dtKhoanMucChungTu = new DataTable();
            dtKhoanMucChungTu.TableName = "KhoanMucChungTu";
            DataTable dtDanhMuc = new DataTable();
            dtDanhMuc.TableName = "DanhMucHangHoa";
          

            #region Preparing Table DanhMucHangHoa
            dtDanhMuc.Columns.Add("Mã", typeof(string));
            dtDanhMuc.Columns.Add("Mã nhóm", typeof(string));
            dtDanhMuc.Columns.Add("Tên", typeof(string));
            dtDanhMuc.Columns.Add("Giá bán lẻ", typeof(decimal));
            dtDanhMuc.Columns.Add("CK bán lẻ (tự nhập)", typeof(int));
            dtDanhMuc.Columns.Add("CK mua (tự nhập)", typeof(int));
            dtDanhMuc.Columns.Add("CK bán buôn (tự nhập)", typeof(int));
            dtDanhMuc.Columns.Add("Đơn vị tính", typeof(string));
            dtDanhMuc.Columns.Add("Tác giả", typeof(string));
            dtDanhMuc.Columns.Add("NXB", typeof(string));
            dtDanhMuc.Columns.Add("Nguồn cung cấp", typeof(string));
            dtDanhMuc.Columns.Add("Ghi chú", typeof(string));
            #endregion

            #region Preparing Table MauNhapHoaDon
            dtMauNhapHoaDon.Columns.Add("Mã", typeof(string));
            dtMauNhapHoaDon.Columns.Add("Số lượng", typeof(decimal));
            dtMauNhapHoaDon.Columns.Add("Giá nhập", typeof(decimal));
            dtMauNhapHoaDon.Columns.Add("Chiết khấu", typeof(decimal));
            #endregion

            #region Preparing Table KhoanMucChungTu
            dtKhoanMucChungTu.Columns.Add("Mã", typeof(string));
            dtKhoanMucChungTu.Columns.Add("Tên", typeof(string));
            dtKhoanMucChungTu.Columns.Add("Đơn vị tính", typeof(string));
            dtKhoanMucChungTu.Columns.Add("Số lượng", typeof(decimal));
            dtKhoanMucChungTu.Columns.Add("Giá bán lẻ", typeof(decimal));
            dtKhoanMucChungTu.Columns.Add("Chiết khấu", typeof(decimal));
            dtKhoanMucChungTu.Columns.Add("Đơn giá thanh toán", typeof(decimal));
            dtKhoanMucChungTu.Columns.Add("Thành tiền thanh toán", typeof(decimal));
            #endregion

            ds.Tables.Add(dtMauNhapHoaDon);
            ds.Tables.Add(dtKhoanMucChungTu);
            ds.Tables.Add(dtDanhMuc);
        }

        static public void PreparingTableForExportExcelFornhapXuatChuyenKho(ref DataSet ds)
        {
            DataTable dtMauNhapHoaDon = new DataTable();
            dtMauNhapHoaDon.TableName = "MauNhapHoaDon";
            DataTable dtKhoanMucChungTu = new DataTable();
            dtKhoanMucChungTu.TableName = "KhoanMucChungTu";
            DataTable dtDanhMuc = new DataTable();
            dtDanhMuc.TableName = "DanhMucHangHoa";


            #region Preparing Table DanhMucHangHoa
            dtDanhMuc.Columns.Add("Mã", typeof(string));
            dtDanhMuc.Columns.Add("Mã nhóm", typeof(string));
            dtDanhMuc.Columns.Add("Tên", typeof(string));
            dtDanhMuc.Columns.Add("Giá bán lẻ", typeof(decimal));
            dtDanhMuc.Columns.Add("CK bán lẻ (tự nhập)", typeof(int));
            dtDanhMuc.Columns.Add("CK mua (tự nhập)", typeof(int));
            dtDanhMuc.Columns.Add("CK bán buôn (tự nhập)", typeof(int));
            dtDanhMuc.Columns.Add("Đơn vị tính", typeof(string));
            dtDanhMuc.Columns.Add("Tác giả", typeof(string));
            dtDanhMuc.Columns.Add("NXB", typeof(string));
            dtDanhMuc.Columns.Add("Nguồn cung cấp", typeof(string));
            dtDanhMuc.Columns.Add("Ghi chú", typeof(string));
            #endregion

            #region Preparing Table MauNhapHoaDon
            dtMauNhapHoaDon.Columns.Add("Mã", typeof(string));
            dtMauNhapHoaDon.Columns.Add("Số lượng", typeof(decimal));
            dtMauNhapHoaDon.Columns.Add("Giá vốn xuất", typeof(decimal));
            #endregion

            #region Preparing Table KhoanMucChungTu
            dtKhoanMucChungTu.Columns.Add("Mã", typeof(string));
            dtKhoanMucChungTu.Columns.Add("Tên", typeof(string));
            dtKhoanMucChungTu.Columns.Add("Đơn vị tính", typeof(string));
            dtKhoanMucChungTu.Columns.Add("Số lượng", typeof(decimal));
            dtKhoanMucChungTu.Columns.Add("Đơn giá vốn xuất", typeof(decimal));
            dtKhoanMucChungTu.Columns.Add("Thành tiền xuất", typeof(decimal));
            #endregion

            ds.Tables.Add(dtMauNhapHoaDon);
            ds.Tables.Add(dtKhoanMucChungTu);
            ds.Tables.Add(dtDanhMuc);
        }
    }
}
